﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using InterfaceOperacion;

namespace Calculadora
{
    public partial class Grafica : Form
    {
        private ServiciosPlugins servicios;
        private ICollection<InterfacePlugin> listaPlugins;
        private InterfacePlugin actual;

        public Grafica(ServiciosPlugins s, ICollection <InterfacePlugin> lista)
        {
            servicios = s;
            listaPlugins = servicios.actualizarPlugins();
            //Por default el plugin seleccionado será el primero de la lista.
            if (listaPlugins.Count != 0) { actual = listaPlugins.First();}
            InitializeComponent();
            this.actualizarComboBox();
        }

        private void botonActualizar_Click(object sender, EventArgs e)
        {
            listaPlugins.Clear();
            listaPlugins = servicios.actualizarPlugins();
            this.actualizarComboBox();
        }

        private void campo1_TextChanged(object sender, EventArgs e)
        {
            this.campo2.Enabled = !string.IsNullOrWhiteSpace(this.campo1.Text);
            this.botonCalcular.Enabled = !string.IsNullOrWhiteSpace(this.campo1.Text) && !string.IsNullOrWhiteSpace(this.campo2.Text);
        }

        private void campo2_TextChanged(object sender, EventArgs e)
        {
            this.botonCalcular.Enabled = !string.IsNullOrWhiteSpace(this.campo1.Text) && !string.IsNullOrWhiteSpace(this.campo2.Text);
        }

        private void botonCalcular_Click(object sender, EventArgs e)
        {
            try
            {
                int selectedIndex = comboBox1.SelectedIndex;
                //selectedIndex devuelve -1 si no se seleccionó ningun item
                if (selectedIndex >= 0)
                {
                    Object selectedItem = comboBox1.SelectedItem;
                    Item i = (Item)selectedItem;
                    actual = i.Value;

                    double o1 = Convert.ToDouble(campo1.Text);
                    double o2 = Convert.ToDouble(campo2.Text);

                    double resul = actual.operar(o1, o2);
                    res.Text = "" + resul;
                }
                else
                {
                    MessageBox.Show("No seleccionó una operación","Error");
                }

            }
            catch (FormatException)
            {
                MessageBox.Show("Campos Invalidos","Error de Formato");
            }
            catch (OverflowException)
            {
                MessageBox.Show("OverFlow","Error");
            }
            catch(DivideByZeroException){
                MessageBox.Show("No se puede dividir por 0","Error de Division");
            }
        }

        private void actualizarComboBox()
        {
            foreach (InterfacePlugin plug in listaPlugins)
            {
                //Si el item no estaba ya en el comboBox, lo agrego.
                if (comboBox1.FindStringExact(plug.simbolo) == -1)
                {
                    comboBox1.Items.Add(new Item(plug.simbolo, plug));
                }
            }
        }


        //Sobreescribo la clase Item para poder agregar Items al ComboBox
        private class Item
        {
            public string Name;
            public InterfacePlugin Value;
            public Item(string name, InterfacePlugin p)
            {
                Name = name; Value = p;
            }
            public override string ToString()
            {
                return Name;
            }
        }

    }
}
